'use strict';

const Controller = require('egg').Controller;

/**
 * @controller 模型 mod
 */

class ModController extends Controller {
  /**
   * @apikey
   * @summary 获取 模型
   * @description 获取 模型
   * @router post /api/v1/mod/all
   * @request body modBodyReqall
   */
  async findAll() {
    const { ctx, service } = this;
    if (ctx.helper.checkModel(ctx)) {
      const res = await service.mod.findAll(ctx.request.body);
      return ctx.helper.body.SUCCESS({ ctx, res });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 获取某个 模型
   * @description 获取某个 模型
   * @router post /api/v1/mod/one
   * @request body modBodyReqone
   */
  async findOne() {
    const { ctx, service } = this;
    if (ctx.helper.checkModel(ctx)) {
      const res = await service.mod.findOne(ctx.request.body);
      return res ? ctx.helper.body.SUCCESS({ ctx, res }) : ctx.helper.body.NOT_FOUND({ ctx });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 创建 模型
   * @description 创建 模型
   * @router post /api/v1/mod/add
   * @request body modBodyReqadd
   */
  async create() {
    const ctx = this.ctx;
    if (ctx.helper.checkModel(ctx)) {
      const res = await ctx.service.mod.create(ctx.request.body);
      return ctx.helper.body.CREATED_UPDATE({ ctx, res });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 模型新增列
   * @description 模型新增列
   * @router post /api/v1/mod/add_col
   * @request body modBodyReqaddcol
   */
  async add_col() {
    const ctx = this.ctx;
    if (ctx.helper.checkModel(ctx)) {
      const res = await ctx.service.mod.add_col(ctx.request.body);
      return ctx.helper.body.CREATED_UPDATE({ ctx, res });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 模型删除列
   * @description 模型删除列
   * @router post /api/v1/mod/del_col
   * @request body modBodyReqdelcol
   */
  async del_col() {
    const ctx = this.ctx;
    if (ctx.helper.checkModel(ctx)) {
      const res = await ctx.service.mod.del_col(ctx.request.body);
      return ctx.helper.body.CREATED_UPDATE({ ctx, res });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 更新 模型
   * @description 更新 模型
   * @router post /api/v1/mod/upd
   * @request body modBodyRequpd
   */
  async update() {
    const { ctx, service } = this;
    if (ctx.helper.checkModel(ctx)) {
      const res = await service.mod.update(ctx.request.body);
      return res && res[0] !== 0 ? ctx.helper.body.CREATED_UPDATE({ ctx }) : ctx.helper.body.NOT_FOUND({ ctx });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 批量删除 模型
   * @description 批量删除 模型
   * @router post /api/v1/mod/del
   * @request body modBodyReqdel
   */
  async destroy() {
    const { ctx, service } = this;
    if (ctx.helper.checkModel(ctx)) {
      const res = await service.mod.destroy(ctx.request.body);
      return res ? ctx.helper.body.NO_CONTENT({ ctx, res }) : ctx.helper.body.NOT_FOUND({ ctx });
    }
    return ctx.helper.body.INVALID_REQUEST({ ctx });
  }

  /**
   * @apikey
   * @summary 直接运行CQL语句
   * @description 直接运行CQL语句
   * @router post /api/v1/mod/run_cql
   * @request body modBodyReqcql
   */
  async run_cql() {
    const { ctx, service } = this;
    const cql = ctx.request.body.cql;
    const res = await service.mod.callDBformat(ctx.request.body, cql);
    return ctx.helper.body.SUCCESS({ ctx, res });
  }

  /**
   * @apikey
   * @summary 查询模型以及属性
   * @description 查询模型以及属性。model传值查询指定模型，不传获取全部
   * @router post /api/v1/mod/node_prop
   * @request body modBodyReqprop
   */
  async node_prop() {
    const { ctx, service } = this;
    let str = '';
    if (ctx.request.body.model && ctx.request.body.model != '') {
      str = `yield nodeType,propertyName where nodeType contains "${ctx.request.body.model}" return propertyName`;
    }
    const cql = `call db.schema.nodeTypeProperties() ${str}`;
    const res = await service.mod.callDB(ctx.request.body, cql);
    return ctx.helper.body.SUCCESS({ ctx, res });
  }

  /**
   * @apikey
   * @summary 查询所有模型
   * @description 查询所有模型
   * @router post /api/v1/mod/node
   */
  async node() {
    const { ctx, service } = this;
    const cql = `CALL db.labels()`;
    const res = await service.mod.callDB(ctx.request.body, cql);
    return ctx.helper.body.SUCCESS({ ctx, res });
  }

  /**
   * @apikey
   * @summary 查询所有关系
   * @description 查询所有关系
   * @router post /api/v1/mod/relate
   */
  async relate() {
    const { ctx, service } = this;
    const cql = `CALL db.relationshipTypes()`;
    const res = await service.mod.callDB(ctx.request.body, cql);
    return ctx.helper.body.SUCCESS({ ctx, res });
  }

  /**
   * @apikey
   * @summary 新增模型之间关系
   * @description 两个模型必须存在，且具有指向性1->2
   * @router post /api/v1/mod/add_relate
   * @request body modBodyReqaddrelate
   */
  async add_relate() {
    const ctx = this.ctx;
    const res = await ctx.service.mod.add_relate(ctx.request.body);
    return ctx.helper.body.CREATED_UPDATE({ ctx, res });
  }

  /**
   * @apikey
   * @summary 删除模型之间关系
   * @description 两个模型必须存在，且具有指向性1->2
   * @router post /api/v1/mod/del_relate
   * @request body modBodyReqaddrelate
   */
  async del_relate() {
    const ctx = this.ctx;
    const res = await ctx.service.mod.del_relate(ctx.request.body);
    return ctx.helper.body.CREATED_UPDATE({ ctx, res });
  }
}

module.exports = ModController;
